package banco.contas;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import banco.exception.SaldoLimiteIndisponivelException;

public class Conta {
	private Agencia agencia;
	private int numero;
	private Pessoa titular;
	private double saldo;
	private String senha;
	private double taxaManutencao;
	private double taxaBasica;
	private double taxaSaque;
	private double taxaTransferencia;
	private double taxaDeposito;

	private List<Movimentacao> historico = new ArrayList<Movimentacao>();

	public Conta() {
		super();
	}

	public Conta(Agencia agencia, int numero, Pessoa titular, double saldo,
			String senha, double taxaManutencao, double taxaBasica,
			double taxaSaque, double taxaTransferencia,double taxaDeposito,
			List<Movimentacao> historico) {
		super();
		this.agencia = agencia;
		this.numero = numero;
		this.titular = titular;
		this.saldo = saldo;
		this.senha = senha;
		this.taxaManutencao = taxaManutencao;
		this.taxaBasica = taxaBasica;
		this.taxaSaque = taxaSaque;
		this.taxaTransferencia = taxaTransferencia;
		this.taxaDeposito = taxaDeposito;
		this.historico = historico;
	}

	public Agencia getAgencia() {
		return agencia;
	}

	public void setAgencia(Agencia agencia) {
		this.agencia = agencia;
	}

	public int getNumero() {
		return numero;
	}

	public void setNumero(int numero) {
		this.numero = numero;
	}

	public Pessoa getTitular() {
		return titular;
	}

	public void setTitular(Pessoa titular) {
		this.titular = titular;
	}

	public void setSaldo(double saldo) {
		this.saldo = saldo;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public double getTaxaManutencao() {
		return taxaManutencao;
	}

	public void setTaxaManutencao(double taxaManutencao) {
		this.taxaManutencao = taxaManutencao;
	}

	public double getTaxaBasica() {
		return taxaBasica;
	}

	public void setTaxaBasica(double taxaBasica) {
		this.taxaBasica = taxaBasica;
	}

	public double getTaxaSaque() {
		return taxaSaque;
	}

	public void setTaxaSaque(double taxaSaque) {
		this.taxaSaque = taxaSaque;
	}

	public double getTaxaTransferencia() {
		return taxaTransferencia;
	}

	public void setTaxaTransferencia(double taxaTransferencia) {
		this.taxaTransferencia = taxaTransferencia;
	}
	
	public double getTaxaDeposito() {
		return taxaDeposito;
	}

	public void setTaxaDeposito(double taxaDeposito) {
		this.taxaDeposito = taxaDeposito;
	}

	
	
	
	public void sacar(double valor) throws SaldoLimiteIndisponivelException {
		if (this.verificarSaldo(valor)) {
			this.saldo -= (valor + this.taxaSaque);
			Movimentacao novaMovimentacao = new Movimentacao(TipoOperacao.SAQUE, valor, new Date());
			this.historico.add(novaMovimentacao);
		} else {
			SaldoLimiteIndisponivelException e = new SaldoLimiteIndisponivelException();
			throw e;
		}
	}

	public void depositar(double valor) {
		this.saldo += (valor - this.taxaDeposito);
		Movimentacao novaMovimentacao = new Movimentacao(TipoOperacao.DEPOSITO,
				valor, new Date());
		this.historico.add(novaMovimentacao);
	}

	public void transferir(Conta beneficiada, double valor)
			throws SaldoLimiteIndisponivelException {
		if (this.verificarSaldo(valor)) {
			this.saldo -= (valor + this.taxaSaque);
			beneficiada.setSaldo(beneficiada.obterSaldo() + valor);
			Movimentacao novaMovimentacao = new Movimentacao(TipoOperacao.TRANSFERENCIA, valor, new Date());
			this.historico.add(novaMovimentacao);
		} else {
			SaldoLimiteIndisponivelException e = new SaldoLimiteIndisponivelException();
			throw e;
		}
	}

	public double obterSaldo() {
		Movimentacao novaMovimentacao = new Movimentacao(TipoOperacao.CONSULTA_SALDO, this.saldo, new Date());
		this.historico.add(novaMovimentacao);
		return this.saldo;
	}

	void emitirExtrato(Date dataInicial) {
		for (Movimentacao movimentacaoAtual : this.historico) {
			if (movimentacaoAtual.getData().equals(dataInicial)) {
				this.saldo -= this.taxaBasica;
				System.out.println(movimentacaoAtual.toString());
			}
		}
	}

	public boolean verificarSaldo(double valor) {
		boolean retorno = true;

		if (this.saldo <= valor) {
			retorno = false;
		}

		return retorno;
	}
}
